package com.java.simple.study.jvm.classloader;

/**
 * @author zhoujunlin
 * @date 2022年05月15日 21:07
 * @desc
 */
public class ClassInitTest {

    private static int num = 1;

    static {
        num = 2;
        // number是在后面声明的
        number = 20;
        System.out.println(num);
        // 编译报错  非法的前向引用 Illegal forward reference
        //System.out.println(number);
    }

    /**
     * 1. linking prepare number 0 initial 20 -> 10
     * 2. 这里是因为静态代码块出现在声明变量语句前面 所以之前被准备阶段为0的number变量会首先被初始化
     * 为20 再接着被初始化为0
     */
    private static int number = 10;


    public static void main(String[] args) {
        new ClassInitTest();
        System.out.println(ClassInitTest.num); //2
        System.out.println(ClassInitTest.number); // 10
    }

}
